//导入express
var express = require('express');
var router = express.Router();
//导入 jwt
const jwt = require('jsonwebtoken');
//导入配置文件
const {secret} = require('../config/config')
//导入模型文档           用户的模型文档
const UserModel = require('../models/UserModel');
const md5 = require('md5');
//导入中间件(验证token的中间件)
let checkTokenMiddleware = require('../middlewares/checkTokenMiddleware');
//引入时间管理依赖包
const dtime = require('time-formater')

/* GET users listing. */
router.get('/template', function(req, res, next) {
  res.send('respond with a resource');
});

//登陆操作
router.post('/login', (req, res) => {
  let { username, password } = req.body;
  UserModel.findOne({ username: username, password: md5(password)})
    .then(data => {
      if (!data) {
        return res.json({
          statuscode:"000",
          code: '2002',
          msg: '用户名或密码错误',
          data: null
        });
      } 

      let token = jwt.sign({
        username: data.username,
        _id: data._id
      }, secret, {
        expiresIn: 60*60*24*7//一周的时间
      });

      res.json({
        statuscode:"000",
        code: '0000',
        msg: '登录成功',
        data: token
      });
    })
    .catch(err => {
      res.json({
        code: '2001',
        msg: '数据库读取失败',
        data: null
      });
    });
});

//注册操作
//try和catch是JavaScript中的异常处理机制。我们可以将可能抛出错误的代码块放在try块中，并在catch块中处理错误。当在try块中的代码抛出异常时，程序的控制流会立即转到catch块，从而可以对错误进行捕获和处理。这样可以防止错误导致程序终止，同时提供更好的容错能力。 
router.post('/register', async (req, res) => {
  const { username, password } = req.body;
  try {
    const existingUser = await UserModel.findOne({ username });
    
    if (existingUser) {
      res.json({
        statuscode:"000",
        code: '0001',
        msg: '该用户名已被注册'
      });
    } else {
      await UserModel.create({
        username,
        password: md5(password),
        registrationdate: dtime(new Date().getTime()).format('YYYY-MM-DD HH:mm')
      });//await表示只有执行完await表达式才可以继续执行，如果不用await则在执行这个异步函数的同时也会执行下面的代码，await只能使用在声明了sync的函数里面
      
      res.json({
        statuscode:"000",
        code: '0000',
        msg: '注册成功'
      });
    }
  } 
  catch (err) {
    console.log("数据读取失败");
    throw err;
  }
});

//获取用户信息（通过对token的解析获得用户姓名）
router.post('/username',checkTokenMiddleware,function(req,res,next){
  const {username} = req.user;
  res.json({
    statuscode:"000",
    data:username,
    msg:"解析token，获取用户username成功"
  })
})

//查询用户所有数据
//获取用户已提交的申请
router.get('/userdata',checkTokenMiddleware,(req,res)=>{
  let {username} = req.user
  UserModel.findOne({username:username})
  .then(data =>{
    res.json({
      statuscode:'000',
      msg:'查询用户数据成功',
      data:data
    })
  })
  .catch(err =>{
    throw err
  })
})


//查询所有用户
router.get('/alluser',(req,res)=>{
  UserModel.find()
  .then(data =>{
    res.json({
      statuscode:'000',
      msg:'查询所有用户数据成功',
      data:data
    })
  })
  .catch(err =>{
    throw err
  })
})

module.exports = router;
